Technote 1118

Unlocking GDHandles Considered Harmful


ñ⁄éü

è«èÛ

ñ‚ëË

âåàçÙ

óvñÒ


ç≈ãflÉAÉbÉvÉãÉRÉìÉsÉÖÅ[É^Ç≈ÇÕMac OSÇ‚àÍïîÇÃÉTÅ[ÉhÉpÅ[ÉeÉBÇÃÉRÅ[ÉhÇ™ÉNÉâÉbÉVÉÖÇÃóvàˆÇΔǻǡǃǢÇÈDZÇΔÇämîFǵNjǵÇΩÅB

DZÇÃåªè€ÇÕì¡íËÇÃQuickDrawÉfÅ[É^ç\ë¢ÇÃÉçÉbÉNÇâèúǵÇΩéûÇ…ãNDZÇËÇ‹Ç∑ÅBǪÇÃå„ÅAÉçÉbÉNÇ™âèúÇ≥ÇÍÇΩÉfÅ[É^ç\ë¢Ç…ÉAÉNÉZÉXǵÇÊǧÇΔÇ∑ÇÈÉRÅ[ÉhǙdžÇÈÇΔÅAÉfÅ[É^ç\ë¢Ç™ÉçÉbÉNÇ≥ÇÍǃǢÇÈëOíÒÇ≈džÇÈÇΩÇflÅAMacintoshÇ™ÉNÉâÉbÉVÉÖǵǃǵNjǧDZÇΔǙdžÇËÇ‹Ç∑ÅB

DZÇÃÉeÉbÉNÉmÅ[ÉgÇÕGDHandleÉfÅ[É^ç\ë¢Çíºê⁄éQèΔÇ∑ÇÈÉfÉxÉçÉbÉpÇÃäFólÇΔÅADZÇÃñ‚ëËDžǬǢǃèÓïÒÇãÅÇflǃǢÇÈÉÜÅ[ÉUÇÃï˚Ç™ëŒè€Ç≈Ç∑ÅB


è«èÛ

ëΩÇ≠ÇÃèÍçáÅADZÇÃñ‚ëËÇ…ÇÊǡǃStdTextÇ™ÉNÉâÉbÉVÉÖǵNjÇ∑ÅiMacsBugÇ≈ÇÕNQDStdTextÇΔïÒçêÇ≥ÇÍÇÈDZÇΔǙdžÇËÇ‹Ç∑Ç™ÅANQDStdTextÇÕStdTextÇÃPowerPCÉoÅ[ÉWÉáÉìÇ≈Ç∑ÅjÅBÉNÉâÉbÉVÉÖÇ™ãNDZÇÈÇÃÇÕÅAÉÅÉÇÉäÇìÆÇ©Ç∑ÇÊǧǻä÷êîÇ™åƒÇ—èoÇ≥ÇÍÇΩdžÇΔÇ…GDHandleÇÃì‡óeÇ™éQèΔÇ≥ÇÍÇΩéûÇ≈Ç∑ÅB

íçà”Ç™ïKóvÇ»ÇÃÇÕÅADZÇÃñ‚ëËÇ…ÇÊÇÈÉNÉâÉbÉVÉÖÇ™ïKÇ∏ǵLJå¥àˆÇΔÇ»ÇÈÉRÅ[ÉhÇÃé¿çséûÇ≈ÇÕÇ»Ç≠ÅAǪÇÃå„ólÅXÇ»èäÇ≈ãNDZÇÈâ¬î\ê´Ç™Ç†ÇÈDZÇΔÇ≈Ç∑ÅBó·Ç¶ÇŒÅAäÑÇËçûÇ›éûÇ…é¿çsÇ≥ÇÍÇÈÉJÅ[É\Éãï`âÊä÷êîÇ™ÉNÉâÉbÉVÉÖÇ∑ÇÈâ¬î\ê´Ç™Ç†ÇËÇ‹Ç∑ÅBÇ≥ÇÁÇ…ÅAÉÅÉÇÉäÉ}ÉlÅ[ÉWÉÉÇ™GDHandleÇÃÉÅÉÇÉäÉuÉçÉbÉNÇà⁄ìÆÇµÇƒÇ¢ÇÈç≈íÜÇ…ÉAÉNÉZÉXÇ≥ÇÍÅAÉNÉâÉbÉVÉÖÇ™ãNDZÇÈâ¬î\ê´Ç‡Ç†ÇËÇ‹Ç∑Ç™ÅADZÇÍÇÕîÒèÌÇ…ãHÇ»ÉPÅ[ÉXÇΔçlǶǃó«Ç¢Ç≈ǵÇÂǧÅB

ñ‚ëË

NewGDevice ()ÇégǡǃGDHandleÇçÏê¨Ç∑ÇÈÇΔÅAGDHandleÇÕÉçÉbÉNÇ≥ÇÍÇΩèÛë‘Ç≈ï‘Ç≥ÇÍÇ‹Ç∑ÅBQuickDrawÇÕGDHandleÇ™èÌÇ…ÉçÉbÉNÇ≥ÇÍǃǢÇÈëOíÒÇ≈ìÆçÏÇǵNjÇ∑ÅBñ‚ëËÇÃóvàˆÇÕÅAÉTÅ[ÉhÉpÅ[ÉeÉBÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔÉAÉbÉvÉãÇÃÉÇÉjÉ^ÅïÉTÉEÉìÉhÉRÉìÉgÉçÅ[ÉãÉpÉlÉãÅiMac OS 8ÇÃÉoÅ[ÉWÉáÉìÇä‹ÇfiÅjÇ™à»â∫ÇÃÇÊǧǻÉRÅ[ÉhÇé¿çsǵǃǢÇÈDZÇΔÇ≈Ç∑ÅB

// ñ‚ëËÇÃÉRÅ[ÉhäJén
GDHandle gdh = GetMainDevice ();
HLock ((Handle) gdh);
// gdhÇ™à⁄ìÆÇ≥ÇÍÇÈÇÊǧǻÉRÅ[ÉhÇé¿çsÇ∑ÇÈ
HUnlock ((Handle) gdh); 
// DZDZǙñ‚ëËÇÃÉRÅ[ÉhÇ≈Ç∑
// ñ‚ëËÇÃÉRÅ[ÉhèIóπ


è„ãLÇÃÉRÅ[ÉhÇÕé¿çsÇÃç€Ç…GDHandleÇ™ÉçÉbÉNÇ≥ÇÍǃǢÇÈDZÇΔÇ™ëOíÒÇ≈èëÇ©ÇÍǃǮÇËÅAç≈èIìIÇ…GDHandleÇÃÉçÉbÉNÇâèúǵǃǵNjǢNjÇ∑ÅBÅiîÁì˜Ç»Ç±ÇΔÇ…ÅAGDHandleÇÉçÉbÉNÇ∑ÇÈïKóvLJç≈èâÇ©ÇÁdžÇËÇ‹ÇπÇÒÇ≈ǵÇΩÅBÅj

íêÅF
ÉÇÉjÉ^ÅïÉTÉEÉìÉhÉRÉìÉgÉçÅ[ÉãÉpÉlÉãÇÃéüä˙ÉoÅ[ÉWÉáÉìÇÕDZÇÃÇÊǧǻñ‚ëËÇãNDZÇ≥ǻǢÇÊǧèCê≥Ç≥ÇÍÇ‹Ç∑ÅB

ÉVÉXÉeÉÄÇÃGraphic DeviceÉäÉXÉgÇ…ä‹Ç‹ÇÍÇÈGDHandleÇÕèÌÇ…ÉçÉbÉNÇ≥ÇÍǃǢÇÈDZÇΔÇ™ïKê{Ç≈Ç∑ÅBDZÇÃèåèÇÕColor QuickDrawÇÃèâä˙ÉäÉäÅ[ÉXÅiMac IIÇÃROMÅjÇ©ÇÁïœÇÌǡǃǢNjÇπÇÒÅBÇ‹ÇΩÅAìñèâÇÃÉ\Å[ÉXÉRÅ[ÉhÇ≈LJÉVÉXÉeÉÄÇÃGraphic DeviceÉäÉXÉgì‡ÇÃGDHandleÇÕÉçÉbÉNÇâèúǵǃÇÕÇ»ÇÁǻǢÇΔãLèqÇ≥ÇÍǃǢNjǵÇΩÅB

ǬNjÇËÅAè«èÛÇ™îcà¨Ç≥ÇÍÇΩÇÃÇÕç≈ãflÇÃDZÇΔÇ≈Ç∑Ç™ÅAñ‚ëËÇÃóvàˆÇÕèÌÇ…ë∂ç›ÇµÇƒÇ¢Ç‹ÇµÇΩÅBÉÅÉÇÉäÉ}ÉlÅ[ÉWÉÉÇÃÉÅÉÇÉäÉuÉçÉbÉNä«óùÉAÉãÉSÉäÉYÉÄÇÕîÒèÌÇ…ï°éGÇ≈ÅAñ‚ëËÇãNDZÇ∑ÇÊǧǻÉAÉvÉäÉPÅ[ÉVÉáÉìÇëñÇÁÇπǃLJè«èÛÇ™èoÇΩÇËÅAèoǻǩǡÇΩÇËÅAñ‚ëËÇÃçƒåªê´ÇÕí·Ç©Ç¡ÇΩÇ≈Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìë§Ç≈ñ‚ëËÇãNDZǵǃǢÇÈDZÇΔÇ…ãCÇ™ïtǩǻǢèÍçáÇ™ëΩǩǡÇΩÇ≈Ç∑ÅB

ÉAÉbÉvÉãÉRÉìÉsÉÖÅ[É^ÇÃãZèpï∂å£ÇåüçıǵÇΩÇΔDZÇÎÅAÉVÉXÉeÉÄGraphic DeviceÉäÉXÉgÇ…ä‹Ç‹ÇÍǃǢÇÈGDHandleÇÃÉçÉbÉNÇÃâèúDžǬǢǃÇÕêGÇÍǃǢNjÇπÇÒÅBMacintoshÇÃÉvÉçÉOÉâÉ~ÉìÉOÇ≈ÇÕÅAëºÇÃÉRÅ[ÉhÇ™ä«óùÇ∑ÇÈÉnÉìÉhÉãÇÃëÆê´ÇïœçXÇ∑ÇÈèÍçáÇÕì¡Ç…ãCÇïtÇØÇÈDZÇΔÇ™èÌéØÇ≈ǵÇΩÇ™ÅADZÇÃìxÇÕDZÇÃÉãÅ[ÉãÇñæämÇ…íÒé¶ÇµÇ‹Ç∑Åià»â∫ÇÃÉfÉxÉçÉbÉpÇ™éÊÇÍÇÈëŒâûçÙÇÇ≤óóâ∫Ç≥Ç¢ÅjÅB


âåàçÙ

âåàçÙÇÕ2ǬdžÇËÇ‹Ç∑ÅB1Ǭñ⁄ÇÕÉfÉxÉçÉbÉpÇ™éÊÇÍÇÈëŒâûçÙÇ≈Ç∑ÅB2Ǭñ⁄ÇÕÉÜÅ[ÉUÅiÉfÉxÉçÉbÉpÇä‹ÇfiÅjÇ™éÊÇÍÇÈâÒîçÙÇ≈Ç∑ÅB

ÉfÉxÉçÉbÉpÇ™éÊÇÍÇÈëŒâûçÙ

Ç‹Ç∏ÅAÉVÉXÉeÉÄÇÃGraphic DeviceÉäÉXÉgÇ…ä‹Ç‹ÇÍÇÈÇÊǧǻGDHandleÇÕÉçÉbÉNÇâèúǵǻǢDZÇΔÇ™àÍî‘èdóvÇ≈Ç∑ÅBGDHandleÇämé¿Ç…ÉçÉbÉNÇ∑ÇÈèÍçáÇÕà»â∫ÇÃÇÊǧǻÉRÅ[ÉhÇé¿çsǵǃâ∫Ç≥Ç¢ÅB

GDHandle gdh = GetMainDevice ();
SInt8 hState = HGetState ((Handle) gdh);
HLock ((Handle) gdh);
// gdhÇ™à⁄ìÆÇ≥ÇÍÇÈÇÊǧǻÉRÅ[ÉhÇé¿çsÇ∑ÇÈ
HSetState ((Handle) gdh, hState);


è„ãLÇÃÉRÅ[ÉhÇÕGDHandleÇÃèÛë‘ÅiÉçÉbÉNÇ≥ÇÍǃǢÇÈǩǫǧǩÅjÇämîFǵǃǩÇÁÉnÉìÉhÉãÇÉçÉbÉNǵÅAç≈èIìIÇ…ÉnÉìÉhÉãÇå≥ÇÃèÛë‘Ç…ñflǵNjÇ∑ÅBǬNjÇËÅAGDHandleÇÕè„ãLÇÃÉRÅ[ÉhÇÃé¿çsëOÇΔé¿çså„Ç≈ÇÕëÆê´Ç™ïœÇÌÇËÇ‹ÇπÇÒÅB

óùëzìIÇ»ä¬ã´Ç…ǮǢǃÇÕÅAGDHandleÇÕèÌÇ…ÉçÉbÉNÇ≥ÇÍǃǢÇÈÇÕÇ∏Ç»ÇÃÇ≈ÅAGDHandleÇÉçÉbÉNÇ∑ÇÈïKóvÇ≥ǶdžÇËÇ‹ÇπÇÒÅBǵǩǵÅAëºÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ‚É\ÉtÉgÉEÉFÉAÇ™ÉVÉXÉeÉÄÇÃGraphic DeviceÉäÉXÉgÇÃGDHandleÇÃÉçÉbÉNÇåÎǡǃâèúÇ∑ÇÈDZÇΔLJçlǶÇÁÇÍÇ‹Ç∑ÇÃÇ≈ÅAè„ãLÇÃÇÊǧǻÉRÅ[ÉhÇé¿çsÇ∑ÇÈDZÇΔÇ™àÍéÌÇÃï€åØÇ≈Ç∑ÅB

LJǧ1ǬÇÃëŒèàï˚ñ@ÇÕGDHandleÇégǧë„ÇÌÇËÇ…ÅAGDHandleÇÃïKóvÉtÉBÅ[ÉãÉhÇÇ∑Ç◊ǃÉçÅ[ÉJÉãïœêîÇ…ÉRÉsÅ[Ç∑ÇÈDZÇΔÇ≈Ç∑ÅBGDHandleÇÃÉtÉBÅ[ÉãÉhÇÃëΩÇ≠ÇÕè¨Ç≥Ç¢ÇÃÇ≈ÅAǪÇÍÇŸÇ«ÇÃïâíSÇ…Ç»ÇÁǻǢÇÕÇ∏Ç≈Ç∑ÅB

ÉAÉbÉvÉãÉRÉìÉsÉÖÅ[É^Ç≈ÇÕÅAÉVÉXÉeÉÄGraphic DeviceÉäÉXÉgÇ…ä‹Ç‹ÇÍǃǢǻǢGDHandleÇÉçÉbÉNÇ∑ÇÈïKóvÇÕǻǢÇΔå©ÇƒÇ¢Ç‹Ç∑ÅBó·Ç¶ÇŒÅANewGWorld ()Ç≈çÏê¨Ç≥ÇÍÇÈGDHandleÇÕÉçÉbÉNÇ™âèúÇ≥ÇÍÇΩèÛë‘Ç≈ï‘Ç≥ÇÍÇ‹Ç∑ÅB

GDHandleÇÉçÉbÉNÇ∑ÇÈïKóvǙdžÇÈèÍçáÅALJǡÇΔLJà¿ëSǩǬóeà’Ç»ï˚ñ@ÇÕGDHandleÇÃèÛë‘Çï€ë∂ǵǃÅAèàóùå„Ç…å≥Ç…ñflÇ∑DZÇΔÇ≈Ç∑ÅBDZÇÍÇÕGDHandleÇ™ÉVÉXÉeÉÄÇÃGraphic DeviceÉäÉXÉgÇ…ä‹Ç‹ÇÍǃǢÇÈǩǫǧǩDžä÷ÇÌÇÁÇ∏ÅAñ‚ëËÇãNDZǵNjÇπÇÒÅB

íêÅF
è„ãLÇÃëŒâûçÙÇÕÉoÉCÉiÉäÇ≈ä˘Ç…íÒãüÇ≥ÇÍǃǢÇÈÉRÅ[ÉhÇ…ÇÕìKâûÇ≈Ç´Ç‹ÇπÇÒÅBDZÇÃÇÊǧǻÉoÉCÉiÉäÇ™GDHandleÇÃÉçÉbÉNÇâèúǵǃǵNjǧÇΔÉNÉâÉbÉVÉÖÇÃóvàˆÇΔÇ»ÇËÇ‹Ç∑ÅBNQDStdTextǻǫÇÃÉVÉXÉeÉÄì‡ïîÇÃä÷êîÇÕGDHandleÇó\ÇflÉçÉbÉNÇ∑ÇÈÇÊǧDžÇÕÇ»ÇËÇ‹ÇπÇÒÅBè„ãLÇÃëŒâûçÙÇéÊÇ¡ÇΩÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉNÉâÉbÉVÉÖÇñΔÇÍǃÅAÉNÉâÉbÉVÉÖÇÃóvàˆÇΔÇ»ÇÈDZÇΔÇÕdžÇËÇ‹ÇπÇÒÅBǵǩǵÅAëºÇÃÉoÉCÉiÉäÇ™GDHandleÇÃÉçÉbÉNÇâèúǵǃǵNjǧÇΔÅAÉVÉXÉeÉÄÇ™ÉNÉâÉbÉVÉÖÇ∑ÇÈâ¬î\ê´ÇÕdžÇËÇ‹Ç∑ÅB

ÉAÉbÉvÉãÉRÉìÉsÉÖÅ[É^Ç™î≠çsǵǃǢÇÈï∂å£Ç…ÇÕHUnlock ()Ç‚HGetState ()ÇΔHSetState ()ÇÃólÅXÇ»èåèÇ≈ÇÃégÇ¢ï™ÇØï˚ǙdžNjÇËâê‡Ç≥ÇÍǃǢNjÇπÇÒÇ≈ǵÇΩÇÃÇ≈ÅADTSÇÕDZÇÃòbëËDžǬǢǃãflì˙íÜÇ…ÉeÉbÉNÉmÅ[ÉgÇî≠çsÇ∑ÇÈó\íËÇ≈Ç∑ÅB


ÉÜÅ[ÉUÇ™éÊÇÍÇÈâÒîçÙ

DZÇÃÉeÉbÉNÉmÅ[ÉgÇÃà»ëOÇÃÉoÅ[ÉWÉáÉìÇ≈ÇÕDZÇÃñ‚ëËÇâÒîÇ∑ÇÈÇΩÇflÇÃã@î\ägí£ÇîzïtÇ∑ÇÈÇΔãLèqÇ≥ÇÍǃǢNjǵÇΩÇ™ÅADZÇÃÇÊǧǻã@î\ägí£ÇÕîzïtÇ≥ÇÍÇ‹ÇπÇÒÅB

óvñÒ

ÉVÉXÉeÉÄÇÃGraphic DeviceÉäÉXÉgÇ…ä‹Ç‹ÇÍǃǢÇÈGDHandleÇÕèÌÇ…ÉçÉbÉNÇ≥ÇÍǃǢÇÈDZÇΔÇ™ïKê{Ç≈Ç∑ÅBàÍïîÇÃÉTÅ[ÉhÉpÅ[ÉeÉBÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔÉAÉbÉvÉãÉRÉìÉsÉÖÅ[É^ÇÃÉÇÉjÉ^ÅïÉTÉEÉìÉhÉRÉìÉgÉçÅ[ÉãÉpÉlÉãÇÕGDHandleÇÃÉçÉbÉNÇâèúǵǃǵNjǢÅAÉNÉâÉbÉVÉÖÇÃóvàˆÇΔǻǡǃǢNjÇ∑ÅBÉVÉXÉeÉÄÇÃGraphic DeviceÉäÉXÉgÇ…ä‹Ç‹ÇÍÇÈGDHandleÇéÊÇËàµÇ§èÍçáÅAÉfÉxÉçÉbÉpÇÕHGetState ()Ç‚HSetState ()ÇégǡǃGDHandleÇÃëÆê´Çï€Ç¬Ç±ÇΔÇ™èdóvÇ≈Ç∑ÅBÇ‹ÇΩÅAÉÜÅ[ÉUÅiÉfÉxÉçÉbÉpÇä‹ÇfiÅjÇÕã@î\ägí£ÅiÉeÉbÉNÉmÅ[ÉgÇéQèΔÅjÇÉCÉìÉXÉgÅ[ÉãÇ∑ÇÈDZÇΔÇ≈DZÇÃñ‚ëËÇâÒîÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

éQçlï∂å£
Inside Macintosh: MemoryÇÃMemory ManagerÇÃèÕ
Inside Macintosh: Imaging with QuickDrawÇÃGraphics DevicesÇÃèÕ
Understanding the Mercutio-GDevice Problem


ïœçXóöó
1998îN2åéÅ@ÉeÉNÉjÉJÉãÅEÉmÅ[Égî≠çs
1998îN6åéÅ@ÅuÉÜÅ[ÉUÇ™éÊÇÍÇÈâÒîçÙÅvÇÃì‡óeÇçÌèú